# -*- conding:UTF-8 -*-

'''
@ Project: p7_flask
@ File: user_cache.py
@ Author: 师路遥
@ Date：2022/6/8 14:10

'''

import random,redis,json
from models.user import *


class BaseCacheTTL(object):
    """
    缓存有效期
    为防止缓存雪崩，在设置缓存有效期时采用设置不同有效期的方案
    通过增加随机值实现
    """
    TTL = 0 # 有子类设置
    MAX_DELTA = 10 * 60 # 随机的增量上限

    @classmethod
    def get_val(cls):
        return cls.TTL + random.randrange(0,cls.MAX_DELTA)


class UserProfileCacheTTL(BaseException):
    """
    用户资料的缓存时间，秒
    """
    TTL = 30 * 60


class UserCache(object):
    """
    从Redis中获取用户缓存信息
    """
    # 思路:
    # 查询Redis中的缓存记录
    # 如果记录存在, 则直接返回
    # 如果记录不存在
    #     去数据库中查询, 如果数据库中存在, 则设置Redis缓存记录, 并返回查询数据
    #     数据库中如果没有记录, 设置Redis中记录的值为-1
    # 返回值    没数据，直接返回
    def __init__(self,user_id):
        self.key = 'user:{}:profile'.format(user_id)
        self.user_id = user_id

    def get(self):
        rds = redis.Redis(password='123456',db=3)
        ret = rds.get(self.key)
        if ret is not None:
            user_dict = json.loads(ret)
            return user_dict
        else:
            user = UserModel.query.filter_by(uid=self.user_id).first()
            if user:
                data = {
                    'account':user.account,
                    'uname':user.uname,
                    'profile_photo':user.profile_photo,
                    'gender':user.gender,
                    'created_time':str(user.created_time),
                }
                try:
                    rds.setex(self.key,BaseCacheTTL.get_val(),json.dumps(data))
                    return json.loads(json.dumps(data))
                except Exception as e:
                    print('mysql 数据库写入redis错误-%s'%e)
            else:
                return None

    def post(self):
        """
        把用户信息写入缓存
        思路分析：
        根据传入的用户ID，判断redis中是否存在
        1.在redis存在，直接返回
        2.在redis不存在
            1.在mysql中存在，写入缓存，返回数据
            2.在mysql中不存在，直接返回 None
        """
        rds = redis.Redis(password='123456',db=3)
        ret = rds.get(self.key)
        if ret:
            user_dict = json.dumps(ret)
            return user_dict
        else:
            user = UserModel.query.filter_by(uid=self.user_id).first()
            if user:
                data = {
                    'account': user.account,
                    'uname': user.uname,
                    'profile_photo': user.profile_photo,
                    'gender': user.gender,
                    'created_time': str(user.created_time),
                }
                try:
                    rds.setex(self.key,BaseCacheTTL.get_val(),json.dumps(data))
                    return json.dumps(data)
                except Exception as e:
                    print('mysql 数据存入 redis错误-%s'%e)
            else:
                return None
























